package com.chatroom.server;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 负责处理单个客户端连接的会话。
 * 每个实例都在一个独立的线程中运行。
 */
public class ClientHandler implements Runnable {

    private final Socket socket;
    private final ChatRoom chatRoom; // 依赖注入的聊天室核心
    private PrintWriter writer;
    private BufferedReader reader;
    private String nickname;

    public ClientHandler(Socket socket, ChatRoom chatRoom) {
        this.socket = socket;
        this.chatRoom = chatRoom;
    }

    @Override
    public void run() {
        try {
            // 初始化IO流
            this.writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8), true);
            this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));

            // 1. 读取客户端发送的第一个消息作为昵称
            this.nickname = reader.readLine();
            if (this.nickname == null || this.nickname.trim().isEmpty()) {
                System.out.println("一个客户端连接了，但未提供昵称，连接已关闭。");
                return; // 结束run方法，线程终止
            }

            // 2. 将自己添加到聊天室管理器中，并由管理器广播上线通知
            chatRoom.addClient(this);

            // 3. 循环读取客户端消息并广播
            String message;
            while ((message = reader.readLine()) != null) {
                System.out.println(this.nickname + ": " + message);
                // 将收到的消息交给聊天室管理器进行广播
                chatRoom.broadcastMessage(this.nickname + ": " + message, this);
            }

        } catch (IOException e) {
            // 通常是客户端主动断开连接或网络异常
            // System.err.println("与客户端 " + (nickname != null ? nickname : "") + " 的连接异常: " + e.getMessage());
        } finally {
            // 4. 清理资源，并通知聊天室管理器移除自己
            chatRoom.removeClient(this);
            try {
                if (socket != null && !socket.isClosed()) {
                    socket.close();
                }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }

    /**
     * 向此客户端发送消息。
     * @param message 要发送的消息。
     */
    public void sendMessage(String message) {
        if (writer != null) {
            writer.println(message);
        }
    }

    /**
     * 获取此客户端的昵称。
     * @return 昵称字符串。
     */
    public String getNickname() {
        return nickname;
    }
}
